package com.linln.modules.system.service.impl;

import com.linln.common.enums.StatusEnum;
import com.linln.modules.system.domain.ItemCat;
import com.linln.modules.system.repository.ItemCatRepository;
import com.linln.modules.system.service.ItemCatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author 小懒虫
 * @date 2018/8/14
 */
@Service
public class ItemCatServiceImpl implements ItemCatService {

    @Autowired
    private ItemCatRepository ItemCatRepository;

    /**
     * 根据菜单ID查询菜单数据
     * @param id 菜单ID
     */
    @Override
    @Transactional
    public ItemCat getById(Long id) {
        if (id == 0L){
            return new ItemCat(id, "顶级分类", "");
        }
        return ItemCatRepository.findById(id).orElse(null);
    }

//    /**
//     * 根据菜单url查询菜单数据
//     * @param url 菜单url
//     */
//    @Override
//    @Transactional
//    public ItemCat getByUrl(String url){
//        return ItemCatRepository.findByUrl(url);
//    }

    /**
     * 获取菜单列表数据
     * @param example 查询实例
     * @param sort 排序对象
     */
    @Override
    public List<ItemCat> getListByExample(Example<ItemCat> example, Sort sort) {
        return ItemCatRepository.findAll(example, sort);
    }

    /**
     * 根据菜单对象的Example判断是否存在
     * @param ItemCat 菜单对象
     */
    @Override
    public ItemCat getByItemCatToExample(ItemCat ItemCat) {
        return ItemCatRepository.findOne(Example.of(ItemCat)).orElse(null);
    }

    /**
     * 获取菜单列表数据
     */
    @Override
    public List<ItemCat> getListBySortOk() {
        Sort sort = Sort.by(Sort.Direction.ASC, "type", "sort");
        return ItemCatRepository.findAllByStatus(sort, StatusEnum.OK.getCode());
    }

    /**
     * 获取排序最大值
     * @param pid 父菜单ID
     */
    @Override
    public Integer getSortMax(Long pid){
        return ItemCatRepository.findSortMax(pid);
    }

    /**
     * 根据父级菜单ID获取本级全部菜单
     * @param pid 父菜单ID
     * @param notId 需要排除的菜单ID
     */
    @Override
    public List<ItemCat> getListByPid(Long pid, Long notId){
        Sort sort = Sort.by(Sort.Direction.ASC, "sort");
        return ItemCatRepository.findByPidAndIdNot(sort, pid, notId);
    }

    /**
     * 保存菜单
     * @param ItemCat 菜单实体类
     */
    @Override
    public ItemCat save(ItemCat ItemCat){
        return ItemCatRepository.save(ItemCat);
    }

    /**
     * 保存多个菜单
     * @param ItemCatList 菜单实体类列表
     */
    @Override
    public List<ItemCat> save(List<ItemCat> ItemCatList){
        return ItemCatRepository.saveAll(ItemCatList);
    }

    /**
     * 状态(启用，冻结，删除)/批量状态处理
     */
    @Override
    @Transactional
    public Boolean updateStatus(StatusEnum statusEnum, List<Long> ids){
        // 获取与之关联的所有菜单
        Set<ItemCat> treeItemCats = new HashSet<>();
        List<ItemCat> ItemCats = ItemCatRepository.findByIdIn(ids);
        ItemCats.forEach(ItemCat -> {
            treeItemCats.add(ItemCat);
            treeItemCats.addAll(ItemCatRepository.findByPidsLikeAndStatus("%[" + ItemCat.getId() + "]%", ItemCat.getStatus()));
        });

        treeItemCats.forEach(ItemCat -> {
            // 删除菜单状态时，同时更新角色的权限
//            if(statusEnum == StatusEnum.DELETE){
//                // 非规范的Jpa操作，直接采用SQL语句
//                ItemCatRepository.cancelRoleJoin(ItemCat.getId());
//            }
            // 更新关联的所有菜单状态
            ItemCat.setStatus(statusEnum.getCode());
        });

        return treeItemCats.size() > 0;
    }
}
